/*
 * @Author: 橘子
 * @Date: 2021-10-08 21:30:09
 * @Project_description: 路由
 * @Description: 代码是我抄的，不会也是真的
 */
import Vue from 'vue'
import VueRouter from 'vue-router'
// 进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import store from '@/store/index'
import {getToken} from '@/libs/auth'
import cookies from '@/libs/util.cookies'
import util from '@/libs/util'
// 路由数据
import routes from './routes'
import { getUserMenu, setGlobalMenuAside, setGlobalMenuHeader } from '../menu/index'
import setting from '@/setting'
import { queryTreeBypath } from '@/libs/util.queryTree'
import { get } from 'lodash'
const VueRouterPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
  return VueRouterPush.call(this, location).catch((err) => err)
}
const VueRouterReplace = VueRouter.prototype.replace
VueRouter.prototype.replace = function replace(location) {
  return VueRouterReplace.call(this, location).catch((err) => err)
}
Vue.use(VueRouter)

// 导出路由 在 main.js 里使用
const router = new VueRouter({
  routes,
})

//写一个重置路由的方法，切换用户后，或者退出时清除动态加载的路由
export function resetRouter() {
  const newRouter = new VueRouter({
    scrollBehavior: () => ({ y: 0 }),
    routes, //引入的公共路由
  })
  router.matcher = newRouter.matcher // reset router
}

/**
 * 路由拦截
 * 权限验证
 */
router.beforeEach((to, from, next) => {
  // 确认已经加载多标签页数据 https://github.com/d2-projects/d2-admin/issues/201
  store.dispatch('d2admin/page/isLoaded')
  // 确认已经加载组件尺寸设置 https://github.com/d2-projects/d2-admin/issues/198
  store.dispatch('d2admin/size/isLoaded')
  // 进度条
  NProgress.start()
  // 关闭搜索面板
  store.commit('d2admin/search/set', false)
  // 这里暂时将cookie里是否存有token作为验证是否登录的条件
  const token = cookies.get('token')
  if (token) {
    // 如果去的是登录页，则跳转到首页
    if (to.path === '/login') {
      next({ path: '/' })
    } else {
      // 判断用户是否存在路由
      if (store.state.d2admin.menu.aside.length == 0 && !token) {
        let data = getUserMenu(util.cookies.get('roleId'))
        if (data[0]) {
          //判断当前请求的路由是否存在于data中
          // 这里不能只对比一层
          let flag = queryTreeBypath(to.path, data)
          if (!flag) {
            next({ path: data[0].path, replace: true })
          } else {
            //动态添加路由
            next({ ...to, replace: true })
          }
        } else {
          cookies.remove('token')
          next({ path: '/login' })
        }
      } else {
        next()
      }
    }
  } else {
    //没有token就需要校验白名单
    if (setting.appInfo.whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单，直接进入
      next()
    } else {
      const redirect = encodeURIComponent(to.fullPath) // 编码 URI，保证参数跳转回去后，可以继续带上
      next(`/login?redirect=${redirect}`) // 否则全部重定向到登录页
    }
  }
  NProgress.done()
})

/**
 * 路由后置拦截
 * 渲染动态页面
 */
router.afterEach(async (to) => {
  // 多页控制 打开新的页面
  await store.dispatch('d2admin/page/open', to)
  // 更改标题
  util.title(to.meta.title)
  // // 进度条
  NProgress.done()
})

export default router
